package io.github.echarts.render;

import io.github.echarts.model.ChartModel;
import io.github.echarts.model.coordinate.CoordinateSystem;
import io.github.echarts.model.geometry.Rectangle;
import io.github.echarts.render.background.BackgroundRenderer;
import io.github.echarts.render.component.ComponentRenderingCoordinator;
import io.github.echarts.render.coordinate.CoordinateSystemRenderingCoordinator;
import io.github.echarts.render.series.SeriesRenderingCoordinator;
import io.github.echarts.render.svg.SVGRenderer;

import java.util.List;

/**
 * 渲染协调器
 * 负责协调整个渲染过程，将渲染逻辑与模型数据分离
 * 这个类负责编排初始化、布局计算和所有图表组件的渲染
 */
public class RenderingCoordinator {
    /** 图表模型 */
    private ChartModel model;
    
    /** 渲染上下文 */
    private RenderContext renderContext;
    
    /** 图形渲染器 */
    private GraphicsRenderer renderer;
    
    /** 背景渲染器 */
    private BackgroundRenderer backgroundRenderer;
    
    /** 坐标系渲染协调器 */
    private CoordinateSystemRenderingCoordinator coordinateSystemCoordinator;
    
    /** 系列渲染协调器 */
    private SeriesRenderingCoordinator seriesCoordinator;
    
    /** 组件渲染协调器 */
    private ComponentRenderingCoordinator componentCoordinator;
    
    /**
     * 构造函数
     * 
     * @param model 图表模型
     * @param renderer 图形渲染器
     */
    public RenderingCoordinator(ChartModel model, GraphicsRenderer renderer) {
        this.model = model;
        this.renderer = renderer;
        
        // 创建渲染上下文
        this.renderContext = new RenderContext(model.getWidth(), model.getHeight());
        
        // 初始化各个渲染协调器
        this.backgroundRenderer = new BackgroundRenderer();
        this.coordinateSystemCoordinator = new CoordinateSystemRenderingCoordinator();
        this.componentCoordinator = new ComponentRenderingCoordinator();
        
        // seriesCoordinator会在prepareCoordinators方法中初始化
        // 这样可以确保SeriesDataManager已经初始化
    }
    
    /**
     * 协调完整的渲染过程，从模型初始化到最终输出
     * 
     * @return 渲染输出（例如SVG字符串）
     */
    public String coordinate() {

        // 准备渲染协调器
        prepareCoordinators();
        
        // 初始化坐标系
        initializeCoordinateSystems();
        
        // 协调渲染过程
        renderer.beginRender(model.getWidth(), model.getHeight());
        renderBackground();
        renderCoordinateSystems();
        renderSeries();
        renderComponents();
        return renderer.endRender();
    }
    
    /**
     * 准备渲染协调器
     * 将模型中的数据传递给各个渲染协调器
     */
    private void prepareCoordinators() {
        // 确保SeriesDataManager已初始化，再创建SeriesRenderingCoordinator
        if (model.getSeriesDataManager() != null) {
            this.seriesCoordinator = new SeriesRenderingCoordinator(model.getSeriesDataManager());
        } else {
            this.seriesCoordinator = new SeriesRenderingCoordinator(null);
        }
        
        // 设置渲染上下文
        this.seriesCoordinator.setRenderContext(renderContext);
        
        // 将模型中的坐标系添加到坐标系渲染协调器
        coordinateSystemCoordinator.addCoordinateSystems(model.getCoordinateSystems());
        
        // 将模型中的组件添加到组件渲染协调器
        componentCoordinator.addComponents(model.getComponents());
    }
    
    /**
     * 初始化坐标系
     * 将布局信息应用到坐标系
     */
    private void initializeCoordinateSystems() {
        List<CoordinateSystem> coordinateSystems = model.getCoordinateSystems();
        
        // 为每个坐标系创建布局信息并存入渲染上下文
        for (CoordinateSystem cs : coordinateSystems) {
            // 这里应该从布局管理器获取更精确的布局信息
            Rectangle area = new Rectangle(50, 50, model.getWidth() - 100, model.getHeight() - 100);
            
            // 创建坐标系信息
            RenderContext.CoordinateSystemInfo info = new RenderContext.CoordinateSystemInfo(area);
            
            // 注册到渲染上下文
            renderContext.registerCoordinateSystem(cs.getId(), info);
        }
    }
    
    /**
     * 渲染图表背景
     */
    private void renderBackground() {
        backgroundRenderer.renderBackground(model, renderer);
    }
    
    /**
     * 渲染所有坐标系
     */
    private void renderCoordinateSystems() {
        coordinateSystemCoordinator.renderCoordinateSystems(renderer);
    }
    
    /**
     * 渲染所有系列数据
     */
    private void renderSeries() {
        seriesCoordinator.renderSeries(renderer);
    }
    
    /**
     * 渲染额外的图表组件，如图例、标题等
     */
    private void renderComponents() {
        componentCoordinator.renderComponents(renderer);
    }
    
    /**
     * 获取渲染上下文
     * 
     * @return 渲染上下文
     */
    public RenderContext getRenderContext() {
        return renderContext;
    }
} 